package qc.module.demo.api.controller;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import qc.common.core.utils.DateUtil;
import qc.module.demo.dto.powerplant.PlantRealDataDto;
import qc.module.demo.dto.powerplant.YzhProductionDataDto;

import java.io.IOException;
import java.util.Date;

/**
 * WebSocketDataPushService
 *
 * @author QuCheng Tech
 * @since 2025/2/13
 */
@RestController
@RequestMapping("websocketpush")//可以指定映射的路由，用于访问指定url触发服务端数据推送
@EnableScheduling//开启定时任务
@Configuration//必须要加该注解，否则不会扫描到定时任务，也可以使用@Component
public class WebSocketDataPushService {
    @Autowired
    private LedDisplayController ledDisplayController;

    @Autowired
    private WebSocketServer webSocketServer;

    //由于每种主题的数据频率不同，因此定时推送的频率也应该不同，定义为不同的方法以便于控制推送频率
    //@Scheduled(fixedRate = 5000)//固定间隔5秒推送1次
    @Scheduled(cron = "0/3 * * * * ?")//固定间隔3秒推送1次
    @RequestMapping(value = "/test", method = {RequestMethod.GET, RequestMethod.POST})
    public void pushTestData() throws IOException {
        String topic = WebSocketConfig.Topic_Test;

        Date now = DateUtil.getNowDate();
        //模拟测试的推送数据
        String message = "模拟消息内容：" + DateUtil.getDateTimeString(now);

        //调用定义的对应的服务类中的send方法
        WebSocketServer.sendTopicMessage(topic, message);
    }

    //@Scheduled(fixedRate = 5000)//固定间隔5秒推送1次
    @Scheduled(cron = "0/20 * * * * ?")//固定间隔20秒推送1次
    @RequestMapping(value = "/send", method = {RequestMethod.GET, RequestMethod.POST})
    public void pushYzhDynamoData() throws Exception {
        Date now = DateUtil.getNowDate();

        //2024年使用的topic为yzh的数据获取及推送
        String topic = WebSocketConfig.Topic_Yzh_Real_Data;
        //模拟不同的数据来源，从数据库中查询获取、从外部系统接口中获取
        //模拟调用阳宗海大屏模拟数据controller中的方法生成返回的数据
        //PlantRealDataDto plantRealDataDto = ledDisplayController.getYzhSimularDynamoRealDatas(now);
        //调用实际阳宗海SIS数据库获取数据接口
        PlantRealDataDto plantRealDataDto = ledDisplayController.getYzhSisDynamoDatas(now);
        //调用定义的对应的服务类中的send方法
        WebSocketServer.sendTopicMessage(topic, JSON.toJSONString(plantRealDataDto));

        //2025年4月开始，WebSocket定时推送的数据为生产数据
        topic = WebSocketConfig.Topic_Yzh_Production_Data2504;
        //2025年4月修改：模拟阳宗海生产数据接口
        //YzhProductionDataDto yzhProductionDataDto = ledDisplayController.getYzhSimularProductionDatas(now);
        YzhProductionDataDto yzhProductionDataDto = ledDisplayController.getYzhActualProductionDatas(now);
        //调用定义的对应的服务类中的send方法
        WebSocketServer.sendTopicMessage(topic, JSON.toJSONString(yzhProductionDataDto));
    }
}
